package visitor;

import operatori.Cat;
import operatori.Minus;
import operatori.Plus;
import operatori.Produs;
import Arbore.Nod;
import functii.elementare.Constanta;
import functii.elementare.Necunoscuta;
import functii.elementare.Putere;
import functii.trigonometrice.Cos;
import functii.trigonometrice.Sin;

public class DerivareVisitor extends Visitor {

	String rezultatDeriv;
	ToStringVisitor tsv = new ToStringVisitor();
	
	public DerivareVisitor(String r) {
		this.rezultatDeriv = r;
	}

	public DerivareVisitor() {
		this.rezultatDeriv = "";
		this.tsv = null;
	}
	
	public String getRezultatDeriv() {
		return rezultatDeriv;
	}

	public void setRezultatDeriv(String rezultatDeriv) {
		this.rezultatDeriv = rezultatDeriv;
	}

	public void visit(Plus p) {
		if(p.getfStang()!= null && p.getfDrept()!= null){
			visit(p.getfStang());
			String f1D = this.rezultatDeriv;
			visit(p.getfDrept());
			String f2D = this.rezultatDeriv;
			p.getfStang().acceptVisitor(tsv);
			String f1 = tsv.getS();
			p.getfDrept().acceptVisitor(tsv);
			String f2 = tsv.getS();
			this.rezultatDeriv = Plus.concatTermens(f1, f2);
		}
	}

	public void visit(Minus m) {
		if(m.getfStang()!= null && m.getfDrept()!= null){
			visit(m.getfStang());
			String f1D = this.rezultatDeriv;
			visit(m.getfDrept());
			String f2D = this.rezultatDeriv;
			m.getfStang().acceptVisitor(tsv);
			String f1 = tsv.getS();
			m.getfDrept().acceptVisitor(tsv);
			String f2 = tsv.getS();
			this.rezultatDeriv = Minus.concatTermens(f1, f2);
		}
	}

	public void visit(Cat m) {
		if(m.getfStang()!= null && m.getfDrept()!= null){
			visit(m.getfStang());
			String f1D = this.rezultatDeriv;
			visit(m.getfDrept());
			String f2D = this.rezultatDeriv;
			m.getfStang().acceptVisitor(tsv);
			String f1 = tsv.getS();
			m.getfDrept().acceptVisitor(tsv);
			String f2 = tsv.getS();
			this.rezultatDeriv = Cat.concatTermens (Minus.concatTermens(Produs.concatTermens(f1D, f2), Produs.concatTermens(f1, f2D)), Produs.concatTermens(f2, f2));
		}
	}

	public void visit(Produs p) {
		if(p.getfStang()!= null && p.getfDrept()!= null){
			visit(p.getfStang());
			String f1D = this.rezultatDeriv;
			visit(p.getfDrept());
			String f2D = this.rezultatDeriv;
			p.getfStang().acceptVisitor(tsv);
			String f1 = tsv.getS();
			p.getfDrept().acceptVisitor(tsv);
			String f2 = tsv.getS();
			this.rezultatDeriv = Plus.concatTermens (Produs.concatTermens(f1D, f2), Produs.concatTermens(f1, f2D));
		}
	}

	public void visit(Putere p) {
		if(p.getfStang()!= null){
			visit(p.getfStang());
			p.getfStang().acceptVisitor(tsv);
			String f1 = tsv.getS();
			this.rezultatDeriv = Produs.concatTermens("2", f1);
		}
	}

	public void visit(Necunoscuta n) {
		this.rezultatDeriv = "1";
	}

	public void visit(Constanta c) {
		this.rezultatDeriv = "0";
		
	}

	public void visit(Sin s) {
		if(s.getfStang()!=null){
			visit(s.getfStang());
			String fsd = this.rezultatDeriv;
			s.getfStang().acceptVisitor(tsv);
			String fs = tsv.getS();
			this.rezultatDeriv=Produs.concatTermens(Cos.concatTermens(fs), fsd);
		}
	}

	public void visit(Cos c) {
		if(c.getfStang()!=null){
			visit(c.getfStang());
			String fsd = this.rezultatDeriv;
			c.getfStang().acceptVisitor(tsv);
			String fs = tsv.getS();
			this.rezultatDeriv=Produs.concatTermens("-"+Sin.concatTermens(fs), fsd);
		}
	}

	public void visit(Nod n) {
		
	}
	
}
